//奇偶校验位生成器

//让所有位进行异或运算 若结果为1则1的个数是奇数 若结果为0的个数是偶数
//若为0即偶校验 当1个数是奇数时，那么输出的bit是1 否则是0 于是此时的输出就是异或结果
//若为1即奇校验，包括检验位1的个数是奇数时，结果为0 包括校验位1的个数是偶数时，结果为1  此时结果为

module parity_generator(
    input wire[7:0] data_in,
    input wire mode, // 0: even 1: odd
    output wire parity_bit
);
//使用缩减异或^

wire tmp = ^data_in;

//输出结果
assign parity_bit = mode==0? tmp : ~tmp;

endmodule


//测试文件
//testbench of parity_generator

`timescale 1ns/100ps

module parity_generator_tb;

    reg[7:0] data_in;
    reg mode;
    wire parity_bit;

    parity_generator parity_generator(
        .data_in(data_in),
        .mode(mode),
        .parity_bit(parity_bit)
    );

    initial begin
        data_in = 8'b00001111; mode = 0;
    #10 data_in = 8'b00001110; mode = 0;
    #10 data_in = 8'b11000000; mode = 1;
    #10 data_in = 8'b11111111; mode = 1;
    #10 $stop;
    end

endmodule